{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### 1. 简述混合高斯模型的基本原理，以及通过混合高斯模型进行背景建模的基本思想。 \n",
    "#### 基本原理及思想\n",
    "+ 在**相机固定，运动目标运动**的系统中，比如\n",
    "\t+ 路口安装的视频监控系统，用来统计车流量;\n",
    "\t+ 车站等公共场所安装的摄像头，用来统计人流量；\n",
    "在这样的系统中，背景相对比较稳定，监控视频中，如果将图像的指定像素的灰度值，沿着**时间轴**在每帧的取值构成一个序列，这个序列的灰度值分布，构成一个随机分布；\n",
    "+ 基于中心极限定理， 高斯分布有一个很重要的性质，在特定条件下，大量统计独立的随机变量的和的分布趋于高斯分布；依据这一定理的结论，**其他概率分布能够用高斯分布作为近似**；\n",
    "+ 我们知道在上述监控系统中，由于周围环境，诸如光线变化、目标阴影、区域内部反光、运动目标不确定性等呈现多种变化的可能，这些变化有些是周期性的，有些是偶然性较强的；那么如何定义一个模型，来模拟这些多变的可能性呢？\n",
    "+ 这时我们想到了中心极限定理的推论，其他概率分布，能够用高斯分布作为近似；那么如果是一个复杂的分布规律，包含了多种因素的分量，我们自然可以想到，可以采用多个高斯分布的混合加权和来做近似，每个高斯分量，分担了原本单个高斯分布无法表示的一些**外在变化的集合**；\n",
    "+ 混合高斯模型，即由若干个**高斯函数线性加权相加**，来模拟每个**像素随时间**的变化规律，即\n",
    "\t$ f(x) = \\sum_{q=1}^{Q}w_{q}N(x;\\mu_{q},\\sigma_{q}) $\n",
    "其中,q为第q个高斯密度函数, Q为函数个数, $ \\mu_{q} $ 和 $ \\sigma_{q} $ 分别为第q个高斯分布的均值和标准差.\n",
    "+ 由于在时间轴上相近的帧，像素灰度值往往是相近的，所以可以采用**迭代法**，来逐步归纳，求取各个高斯分量的**权重w,均值$ \\mu $, 标准差 $ \\sigma $ **, 在得到这些结果后，进而按照**阈值**来提取**背景**和**前景**部分。\n",
    "\n",
    "+ 算法步骤:\n",
    "\t(1) 令Q=1, $ w_{1}=1.0, \\mu_{1}=I(1), \\sigma_{1}=100 $(取一个较大值);\n",
    "\t(2) 在t时刻, \n",
    "\t\tif $ |x_{t} - \\mu_{q,t}|<2.5*\\sigma_{q,t}, q\\epsilon [1, Q] $ then\n",
    "\t\t\t$ w_{q}(t) = (1 - \\alpha)w_{q}(t-1) + \\alpha M_{q}(t) $\n",
    "\t\t\t$ \\mu_{q}(t) = (1 - \\rho)\\mu_{q}(t-1) + \\rho I(t) $\n",
    "\t\t\t$ \\sigma_{q}^{2}(t) = (1 - \\rho)\\sigma_{q}^{2}(t - 1) + \\rho[I(t) - \\mu_{q}(t)]^{2}$\t\t\t\n",
    "\t\t\t$ \\rho = \\alpha G(I(t); \\mu_{q},\\sigma_{q}) $\n",
    "\t\telse\n",
    "\t\t\tturn to (3);\n",
    "\t(3) 新增一个$ w_{q + 1}N(I; \\mu_{q+1},\\sigma_{q+1}), $ 其中$ w_{q+1}=1.0, \\mu_{q+1}=I(t),\\sigma_{q+1}=100 $\n",
    "\t    if q == Q and Q > 5 then\n",
    "\t\t删除权重最小的高斯函数\n",
    "\t(4) 设置阈值为T，表示背景所占比例, 将权重进行归一化(是为了保证混合高斯密度函数积分为1)， 按照$ \\frac{w}{\\alpha^{2}} $ 降序排列，当找到最小的b, 使得 $ \\sum_{q=1}^{b}w_{q}>T $ 时，即可判别为背景;\n",
    "\t(5) 去掉背景部分，图像中剩余的即为背景。\n",
    "\n",
    "+ 进一步分析\n",
    "\t+ 根据迭代过程中，**$ w, \\mu, \\sigma $** 的计算过程，可以看出，每次迭代时，既考虑了**历史**，又考虑了**现在**，采用**线性加权**的做法，最终学习的过程，是更在乎历史，还是更在乎现在，是根据**学习因子** $ \\alpha $来调整的；所以对变化情况不同的视频的背景提取，$ \\alpha $的值的选取较为重要；\n",
    "\t+ 高斯分量**权重w**， 它的意义可以理解为某个分量在整个分布中的重要性，换句话说，表达了**该像素处于某个灰度值附近的时间的长短**；比如一天中，光线处于中等程度的时间最长，这种灰度值中心对应的高斯分量权重的w也会较大；\n",
    "\t+ 如果理想情况下，环境本身不发生任何变化的话，单个高斯分布就可以模拟背景建模，但现实情况是，指定像素的值的分布，往往存在**多个高斯中心**，这称为**多峰**特性，比如光照中午比下午强，下午比晚上强，这种变化都属于**缓慢发生的变化**，这种缓慢的变化，正是形成多峰特性的原因；特别适合混合高斯分布的背景建模方法；\n",
    "\t+ 根据上面的分析，混合高斯分布**并不能模拟诸如光线发生突变**，然后又持续不长后恢复原状的场景；对于目标也是这样，适合于**检测缓慢移动的物体**，比如缓慢行驶的车辆，它的检测结果轮廓也会比较完整。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 解释光流计算中的恒定亮度假设，进一步简述L-K光流估计方法的基本原理。 \n",
    "光流估计的目标，是用来追踪视频中特征点的运动\n",
    "\n",
    "光流，它是空间运动物体在观察成像平面上的像素运动的瞬时速度，是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系，从而计算出相邻帧之间物体的运动信息的一种方法；比如坐在车上看窗外，能够明显的看到路边的山和树在往后退，这里的山和树，就是由特定像素模式组成的组件，它们的运动，可以认为是光流。\n",
    "\n",
    "在光流估计过程中，像素值被看做沿着三个维度发生变化：x位置, y位置, 时间帧数t；\n",
    "假设处于(x,y)的像素在t帧的灰度值为 $ I(x, y, t) $, 则当x,y,t各发生一个微小的变化时，目标像素的灰度值为: $ I(x + dx, y + dy, t + dt) $，\n",
    "\n",
    "这里引入了第一个假设，即\n",
    "**恒定亮度假设**\n",
    "就是假设\n",
    "\t$ I(x + dx, y + dy, t + dt) = I(x, y, t) $\n",
    "\n",
    "于是根据泰勒级数展开的近似处理，可以认为\n",
    "\t$ I(x + dx, y + dy, t + dt) = I(x, y, t) +  I_{x}dx + I_{y}dy + I_{t}dt $\n",
    "由于\n",
    "\t$ I(x + dx, y + dy, t + dt) = I(x, y, t) $\n",
    "因此得到光流约束方程\n",
    "\t$ I_{x}dx + I_{y}dy + I_{t} = 0 $\n",
    "\n",
    "由于一个方程2个未知数dx, dy，没法解啊，于是引入了第二个假设：\n",
    "**指定像素周围的微小区域范围内的像素的运动，可以近似认为与指定像素自己满足共同的运动规律。**\n",
    "即在(x,y)附近采样N个像素，组成小方格，小方格内N个像素，都满足一样的光流约束方程，可以写成：\n",
    "\n",
    "$ \\begin{bmatrix}I_{x_{1}}&I_{y_{1}}\\\\\\I_{x_{2}}&I_{y_{2}}\\\\\\ ...&... \\\\\\I_{x_{N}}&I_{y_{N}}\\end{bmatrix}\\begin{bmatrix}u\\\\\\v\\end{bmatrix} = -\\begin{bmatrix}I_{t_{1}}\\\\\\I_{t_{2}}\\\\\\ ... \\\\\\I_{t_{N}}\\end{bmatrix} $\n",
    "设\n",
    "$ A = \\begin{bmatrix}I_{x_{1}}&I_{y_{1}}\\\\\\I_{x_{2}}&I_{y_{2}}\\\\\\ ...&... \\\\\\I_{x_{N}}&I_{y_{N}}\\end{bmatrix}\n",
    "$\n",
    "$\n",
    "U = \\begin{bmatrix}u\\\\\\v\\end{bmatrix}\n",
    "$ \n",
    "$\n",
    "b = -\\begin{bmatrix}I_{t_{1}}\\\\\\I_{t_{2}}\\\\\\ ... \\\\\\I_{t_{N}}\\end{bmatrix}\n",
    "$\n",
    "则\n",
    "$\n",
    "U = (A^{T}A)^{-1}A^{T}b\n",
    "$\n",
    "若假设在一个小的邻域内，像素的速度近似一致，那么引入速度因子w,则有\n",
    "$\n",
    "U = (A^{T}W^{2}A)^{-1}A^{T}W^{2}b\n",
    "$\n",
    "进而可参考Harris角点检测的思路，是否有可信解，转化为对矩阵$ A^{T}W^{2}A $特征值的取值$ \\lambda_{1}和\\lambda_{2} $的情况分析:\n",
    "+ 当 $ \\lambda_{1} >> \\lambda_{2} $ 或 $ \\lambda_{1} << \\lambda_{2} $ 时，表示沿某一方向灰度值剧烈变化，即边缘；\n",
    "+ 当 $ \\lambda_{1} \\rightarrow 0, \\lambda_{2} \\rightarrow 0 $ 时，表示低纹理区域，即flat area.\n",
    "+ 当 $\\lambda_{1}$与$\\lambda_{2}$取值都较大，且大致接近时，表示沿任意方向灰度值都剧烈变化，即角点；\n",
    "\n",
    "但是上述方法，都只能处理量级较小的运动情况的估计，当处理运动较大的情形时，需要引入L-K方法；即在前面方法的基础上，进行了上采样的方法，构成L-K金字塔，这样对大位移增加了鲁棒性。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
